package com.init;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;


import javax.annotation.PostConstruct;
/**
 * DatabaseInitializer 是一个组件类，负责在应用程序启动时初始化数据库。
 * 它会检查特定表（如 users 表）是否存在，如果不存在，则创建该表。
 */
@Component
public class DatabaseInitializer {

    /**
     * jdbcTemplate 是一个 Spring 提供的模板类，用于简化 JDBC 操作。
     * 它被注入到这个类中，以方便执行 SQL 查询和更新。
     */
    private final JdbcTemplate jdbcTemplate;

    /**
     * 构造函数用于依赖注入，将 JdbcTemplate 注入到 DatabaseInitializer 中。
     *
     * @param jdbcTemplate 用于执行 SQL 查询和更新的 JdbcTemplate 实例
     */
    @Autowired
    public DatabaseInitializer(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    /**
     * init 方法标记为 @PostConstruct，表示它将在所有依赖项都被注入后执行。
     * 这个方法会在应用程序启动时自动调用，用来初始化数据库。
     */
    @PostConstruct
    public void init() {
        // 检查 users 表是否已经存在，如果不存在则创建该表
        if (!tableExists("user")) {
            createUsersTable();
        }
    }

    /**
     * tableExists 方法用于检查给定名称的表是否存在于当前数据库中。
     *
     * @param tableName 要检查的表名
     * @return 如果表存在返回 true，否则返回 false
     */
    private boolean tableExists(String tableName) {
        // 使用 information_schema.tables 表来查询指定的表是否存在
        return jdbcTemplate.queryForObject(
            "SELECT COUNT(*) FROM information_schema.tables WHERE table_name = ?",
            new Object[]{tableName},
            Integer.class
        ) > 0;
    }

    /**
     * createUsersTable 方法用于创建 users 表。
     * 此表包含 id（主键）、username 和 email 三个字段。
     */
    private void createUsersTable() {
        // 执行 SQL 语句创建 users 表
        jdbcTemplate.execute("CREATE TABLE user ("
            + "id INT(6) ZEROFILL AUTO_INCREMENT PRIMARY KEY,  -- 用户id "
            + "user_name VARCHAR(20) NOT NULL,  -- 用户名 "
            + "user_password VARCHAR(20) NOT NULL,  -- 用户密码"
            +" user_role ENUM('管理员', '员工') DEFAULT '员工',  -- 用户角色"
            +" state ENUM('正常', '禁用') DEFAULT '正常'  -- 用户状态"
            );
    }
}